Chatting Room

매개자(Mediator)는 컴포넌트 간의 커뮤니케이션 등을 돕기 위한 메커니즘이다.
Chatting Room
struct Person{
string name;
ChatRoom* room=nullptr;
vector<string> chat_log;
Person(const string& name);
void receive(const string& origin, const string& message);
void say(const string& message) const;
void pm(const string& who, const string& message) const;
};
receive: 메시지를 수신한다. 화면에 수신하는 메시지 출력 및 대화 내용 업데이트
say: 채팅 룸의 모든 참여자에게 메시지를 전송
pm: 개인 메시지(Private Massage, PM) 기능

say(), pm() 함수는 채팅 룸에서 수행되어야 하는 작업을 중계하는 역할을 한다.
struct ChatRoom{
vector<Person*> people;
void join(Person* p);
void broadcast(const string& origin, const string& message);
void message(const string& origin, const string& who, const string& message);
};
join: 사용자가 입장할 수 있도록 함
broadcast: 채팅룸의 모든 참여자에게 메시지를 전송(자신을 제외한)
message: 개인 메시지를 전송
void ChatRoom::join(Person* p){
string join_msg=p->name+" joins the chat";
broadcast("room", join_msg);
p->room=this;
people.push_back(p);
}
void ChatRoom::broadcast(const string& origin, const string& message){
for(auto p: people)
if(p->name != origin) p->recieve(origin, message);
}
void ChatRoom::message(const string& origin, const string& who, const string& message){
auto target=find_if(begin(people), end(people), [&](const Person* p){ return p->name==who; });
if(target!=end(people)){
(*target)->receive(origin, message);
}
}
void Person::say(const string& message) const {
room->braodcast(name, message);
}
void Person::pm(const string& who, const string& message) const {
room->message(name, who, message);
}
void Person::receive(const string& origin, const string& message){
string s{origin+": \""+message+"\""};
cout<<"["<<name<<"'s chat session] "<<s<<'\n';
chat_log.emplace_back(s);
}
//
ChatRoom room;
Person john{"john"};
Person jane{"jane"};
room.join(&john);
room.join(&jane);
john.say("hi room");
jane.say("oh, hey john");
Person simon("simon");
room.join(&simon);
simon.say("hi everyone!");
jane.pm("simon", "glad you could join us, simon");